
/**
 * 
 */
package br.gov.sjc.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;
import java.util.UUID;
import org.apache.commons.net.ftp.FTPClient;
import br.gov.sjc.aluguelsocial.R;
import br.gov.sjc.dao.BaseDAO;
import br.gov.sjc.utils.Ambiente;
import android.content.Context;
import android.util.Log;
import android.widget.TextView;

/**
 * @author rodrigo.ramos
 * em uso
 */
public class ClasseFTP {
	
	
	private static String TAG = "ClasseFTP";
	//private static String file = "/data/data/br.gov.sjc.aluguelsocial/files/";
	private static String file = BaseDAO.FILES;
		
	FTPClient ftp = new FTPClient();
	TextView notificacao;
	boolean retorno = false;
	private Context contexto;
	private  String IP = "189.38.80.49";
	private  String LOGIN = "celebrandoavida";
	private  String SENHA = "";
	private  String DIRFTPDL = "aluguelsocial/Novo";
	private  String DIRFTPUL = "aluguelsocial";
	private  String DIRBKPUL = "aluguelsocial/bkp";

	public ClasseFTP(Context context){
		contexto = context;
	}
	
	public void verificaAmbiente(){
		
		/*
		 * Verifica se o sistema está apontado para banco de Produção
		 */
		Ambiente a = new Ambiente();
		String t = null;
		
		t = a.VerificaAmbiente(contexto);
		
		if (t.equals("Produção")){
			//produção
			 IP = "10.1.12.31";
			 LOGIN = "ntadm/social.alimenta"; //mantém o usuário do social alimenta
			 SENHA = "so1234";
			 DIRFTPDL = "tablet_ftp/Novo";
			 DIRFTPUL = "tablet_ftp";
			 DIRBKPUL = "tablet_ftp/bkp";

		}else{
			//teste
			 IP = "10.1.30.1";
			 LOGIN = "ntadm/social.alimenta";
			 SENHA = "so1234";
			 DIRFTPDL = "tablet_ftp/Novo";
			 DIRFTPUL = "tablet_ftp";
			 DIRBKPUL = "tablet_ftp/bkp";
		}
	}
	
	
	/**
	 * 
	 * @param Arquivo
	 * @return boolean
	 * @throws IOException 
	 * @throws SocketException 
	 */
	public boolean downloadFTP(String diretorioAndroid, String arquivoFTP) throws SocketException, IOException{
		boolean retorno = false;
		FileOutputStream arqReceber = null;
		//Recupera o caminho padrão do SDCARD
		//File root = Environment.getExternalStorageDirectory();
		
		verificaAmbiente();
		
		try{

			ftp.connect(IP);  
			Log.i("DownloadFTP", "Connected: "+IP);
			ftp.login(LOGIN, SENHA);
			Log.i("DownloadFTP", "Logged on");
			ftp.enterLocalPassiveMode();  
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
			arqReceber = new FileOutputStream(file.toString()+arquivoFTP.toString());
			if (ftp.retrieveFile(DIRFTPDL+"/"+arquivoFTP.toString(), arqReceber )){
				retorno = true;
			}else{
				retorno = false;
			}
			ftp.disconnect();
			Log.i("DownloadFTP", "retorno:"+retorno);

		}catch(Exception e){
			ftp.disconnect();
			Log.e("DownloadFTP", "Erro:"+e.getMessage());
		}finally{
			Log.e("DownloadFTP", "Finally");
		}
		return retorno;
	}

	/**
	 * Unico método ftp em uso atualmente
	 * @param ipFTP
	 * @param loginFTP
	 * @param senhaFTP
	 * @param diretorioFTP
	 * @param diretorioAndroid
	 * @param arquivoFTP
	 * @return
	 */
	public boolean uploadFTP(String diretorioAndroid, String arquivoFTP){ 
		verificaAmbiente();
		try {  
			File file = new File(diretorioAndroid);  
			File file2 = new File(diretorioAndroid + arquivoFTP); 
			Log.v(TAG, "uploadFTP - Atribuidas as variáveis"); 
			String status = "";
			if (file.isDirectory()) {  
				Log.v(TAG,"uploadFTP - é diretório"); 
				if(file.list().length > 0){ 
					Log.v(TAG,"uploadFTP - file.list().length > 0"); 

					ftp.connect(IP);  
					ftp.login(LOGIN, SENHA);  
					ftp.enterLocalPassiveMode();  
					ftp.setFileTransferMode(FTPClient.ASCII_FILE_TYPE);  
					ftp.setFileType(FTPClient.ASCII_FILE_TYPE);  
					ftp.changeWorkingDirectory(DIRFTPUL);  
					FileInputStream arqEnviar = new FileInputStream(diretorioAndroid + arquivoFTP);
					Log.v(TAG,"uploadFTP - FileInputStream declarado");
					
					FileInputStream arqEnviarBKP = new FileInputStream(diretorioAndroid + arquivoFTP);
					Log.v(TAG,"uploadFTP - FileInputStream declarado BKP");

					//gera o nome do BKP DIRBKPUL+"/"
					UUID uuid = UUID.randomUUID();    
					String myRandom = uuid.toString();    

					
						if (ftp.storeFile(arquivoFTP, arqEnviar)) { 
							ftp.changeWorkingDirectory(DIRBKPUL);  
							if (ftp.storeFile(myRandom.substring(0,15)+"-"+arquivoFTP, arqEnviarBKP)){
							Log.v(TAG,"uploadFTP - ftp.storeFile(arquivoFTP, arqEnviar)");
							//TODO: retirado o logout opara parar o erro:ERRO FTP: org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication. 
							//ftp.logout();  
							//ftp.disconnect();  
							status = ftp.getStatus().toString();
							Log.v(TAG,"uploadFTP - getStatus(): "+status); 

							if (file2.delete()) {  
								Log.i(TAG,"uploadFTP - Arquivo " + arquivoFTP + " excluído com sucesso");
								retorno = true;
								// return retorno;  
							} else {  
								Log.e(TAG,"uploadFTP - Erro ao excluir o arquivo " + arquivoFTP); 
								retorno = false;
								//return retorno;  
							}  

						} else {  
							//ftp.logout();  
							//ftp.disconnect();  
							Log.e(TAG,"uploadFTP - ERRO: arquivo " + arquivoFTP + " não foi enviado!"); 
							retorno = false;
							//  return retorno;  
						}
					}else{
						Log.e(TAG,"uploadFTP - ERRO: arquivo " + arquivoFTP + " não foi enviado!"); 
						retorno = false;
					}

				}  
				else  
				{  
					Log.e(TAG,"uploadFTP - Não existe o arquivo " + arquivoFTP + "neste diretório!");  
					retorno = false;
					// return retorno;  
				}  
			}  
			else  
			{  
				Log.e(TAG,"uploadFTP - Não é diretório"); 
				retorno = false;
				// return retorno;  
			}  

			//status += ftp.getStatus();
			if (ftp.isConnected()){
				Log.v(TAG,"uploadFTP - isConnected ");
				//ftp.quit();
				//ftp.logout();  
				//ftp.disconnect();
				ftp.abort();
				status = ftp.getStatus().toString();
				Log.v(TAG,"uploadFTP - quit "+retorno);
			}



			return retorno;
		} catch (IOException e) {  
			Log.e(TAG,"uploadFTP - ERRO FTP: " + e); 
			retorno = false;
			return retorno;  
		} finally {
			Log.v(TAG,"uploadFTP - finally executado");  
		}

	}  


}
